package com.shop.config;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.Set;

/**
 * @author 'banxia'
 * @version 1.0
 * @description 自定义的JDK，提供各种静态的方法
 * @date 2023/2/22 1:13
 */
public class MyJDK {

    public static <T> T JsonToObj(String json,Class<T> c) throws Exception {
        //（1）获取s中包含的所有json字段
        String t = json.substring(1, json.length() - 1);//去掉{}
        String[] split = t.split(","); //依次分离各个字段映射关系
        HashMap<String,String> map=new HashMap<>();
        for (String st : split) {
            String[] sp = st.split(":");
            String key=sp[0].substring(1,sp[0].length()-1);
            String val=sp[1];
            if (sp[1].contains("\"")){
                val=sp[1].substring(1,sp[1].length()-1);
            }
            map.put(key,val);
        }
        //自定义实现返回会存在val值为String但属性值为Long的情况。。这里暂时不实现
/*        //（2）创建返回值对象
        T obj = c.newInstance();
        //（3）通过map中的键值对映射关系将值映射到obj中
        Set<String> keys = map.keySet();
        for (String key : keys) {
            try {
                String val=map.get(key); //获取属性值
                Field field_name = c.getDeclaredField(key); //获取要注入的属性
                field_name.setAccessible(true);//开启访问权限
                field_name.set(obj,val); //将属性值注入
            } catch (Exception e) {
                throw new Exception("json转换存在不匹配的字段");
            }
        }*/
        //（3）验证是否每个属性值都存在！
        Set<String> keys = map.keySet();
        for (String key : keys) {
            try {
                c.getDeclaredField(key); //获取要注入的属性
            } catch (Exception e) {
                throw new Exception("json转换存在不匹配的字段");
            }
        }
        return JSONObject.parseObject(json,c);
    }
}
